/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_EagoTech_CAN.c
** 模块名称： EagoTechCAN协议处理模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
**
******************************************************************************/

/******************************************************************************
* 头文件
******************************************************************************/
#include <string.h>
#include "Config.h"
#include "App_Protocol.h"
#include "App_MainTask.h"
#include "App_Parameter.h"
#include "multi_cyc_fifo.h"
#include "bsp.h"
/******************************************************************************
* 本文件宏定义 ('#define')
******************************************************************************/

/******************************************************************************
* 本文件类型定义 ('typedef')
******************************************************************************/

/******************************************************************************
* 本文件静态函数声明 ('static')
******************************************************************************/
static void vCAN_Receive_Message(can_rx_message_type *pCanRxMsg,strBikeInfo *pBikeInfo);
static void vCan_Send_DisplayMessage(uint32_t ID,strBikeInfo   *pBikeInfo);
static void vPROTOCOL_Factory_Response(uint32_t Cmd,uint16_t Data);

/******************************************************************************
* 全局变量定义
******************************************************************************/
strBikeInfo             gxBikeInfo = {0};         /*车辆数据*/
static uint32_t         gulCommunicationCnt = 0;
static uint8_t          gucMCUErrorCnt = 0;
static uint8_t          gucBMSErrorCnt = 0;
/*****************************************************************************
* 函数实现 - global ('extern') and local ('static')
******************************************************************************/

/******************************************************************************
** 功  能：CAN协议初始化函数
** 参  数：无
** 返回值：无
** 备  注：用于初始化CAN协议模块的相关变量，同时创建收发队列。
******************************************************************************/
void vPROTOCOL_Init(void)
{
    muilt_cyc_fifo_error_code_t    lxState;
    MCF_ApplyFifo(gxCAN_RxQueue_Len,gxCAN_RxQueue,&lxState);     /*初始化接收队列*/
    MCF_ApplyFifo(gxCAN_TxQueue_Len,gxCAN_TxQueue,&lxState);     /*初始化发送队列*/
    gxBikeInfo.Battery.Soc = -1;    /*初始化电池电量值为-1，用于判断是否能读取到电池的SOC*/
}



/******************************************************************************
** 功  能：将接收到的Can帧解析为用户的Can数据结构
** 参  数：pCanMessage-接收到的Can数据结构体指针
** 返回值：无
** 备  注：该函数是整个Can协议模块的入口函数。当CAN总线接收一帧Can数据后，调用该函数，
**        将Can消息帧转换为用户的CAN数据格式，并且放入接收队列
******************************************************************************/
void vCAN_CanMsgToUserMsg(can_rx_message_type *pCanMessage)
{

    muilt_cyc_fifo_error_code_t lxState;

    /*柯迪斯CAN协议，无需转换，直接将Can数据放入FIFO队列*/
    MCF_WriteDataInFifo(gxCAN_RxQueue,(uint8_t *)pCanMessage,sizeof(can_rx_message_type),&lxState);
}




/******************************************************************************
** 功  能：CAN协议轮询，处理收发
** 参  数：无
** 返回值：无
** 备  注：该函数是模块主函数，应定时调用，调用周期一般10-20ms，定时处理收发
******************************************************************************/
void vPROTOCOL_Loop(void)
{
    static uint32_t lulTicks = 0;

    can_rx_message_type     lxCanRxMsg;
    can_tx_message_type     lxCanTxMsg;
    muilt_cyc_fifo_error_code_t lxState;
    uint16_t lxFifoCanReadLen;
    uint16_t lxActualReadLen;

    /*当有关机请求时，发送关机报文，其它报文不发*/
    if(gxBikeInfo.Display.PowerOff == 1)
    {
        if(lulTicks % (250 / CAN_LOOP_CYCLE) == 0)
        {
            /*发关机指令前，先发关灯和0档指令*/
            vCan_Send_DisplayMessage(0x13E,&gxBikeInfo);    /*挡位*/
            vCan_Send_DisplayMessage(0x1C2,&gxBikeInfo);    /*大灯*/
            vCan_Send_DisplayMessage(0x102,&gxBikeInfo);
        }
    }
    else
    {
        /*120ms发送一次数据*/
        if(lulTicks % (120 / CAN_LOOP_CYCLE) == 0)
        {
            vCan_Send_DisplayMessage(0x13E,&gxBikeInfo);    /*挡位*/
            vCan_Send_DisplayMessage(0x13F,&gxBikeInfo);    /*单位*/
            vCan_Send_DisplayMessage(0x1C2,&gxBikeInfo);    /*大灯*/
            vCan_Send_DisplayMessage(0x1CC,&gxBikeInfo);    /*助推*/
        }

        /*1000ms发送一次数据*/
        if(lulTicks % (1000 / CAN_LOOP_CYCLE) == 0)
        {
            vCan_Send_DisplayMessage(0x300,&gxBikeInfo);
        }
    }

    lulTicks++;
    gulCommunicationCnt++;

    /*10S之内，通信超时变量未复位，报30错误*/
    if(gulCommunicationCnt > (10000 / CAN_LOOP_CYCLE))
    {
        gxBikeInfo.ErrCode = 0x30;
    }
    else
    {
        if(gxBikeInfo.ErrCode == 0x30)
        {
            gxBikeInfo.ErrCode = 0;
        }
    }

    /*MCU的报错帧，如果1000ms以上没有发送，认为是没有错误，复位错误代码为0*/
    if(++gucMCUErrorCnt > (1000 / CAN_LOOP_CYCLE))
    {
        if(gxBikeInfo.MCU.ErrorCode > 0)
        {
            gxBikeInfo.MCU.ErrorCode = 0;
        }
    }
    /*BMS的报错帧，如果1000ms以上没有发送，认为是没有错误，复位错误代码为0*/
    if(++gucBMSErrorCnt > (1000 / CAN_LOOP_CYCLE))
    {
        if(gxBikeInfo.Battery.ErrCode > 0)
        {
            gxBikeInfo.Battery.ErrCode = 0;
        }
    }

    /*判断接收队列是否非空*/
    MCF_GetCanReadLen(gxCAN_RxQueue,&lxFifoCanReadLen,&lxState);
    if(lxState == kMultiCycFiFo_Error_NONE && lxFifoCanReadLen > 0)
    {
        MCF_ReadDataFromFifo(gxCAN_RxQueue,sizeof(can_rx_message_type),(uint8_t *)&lxCanRxMsg,&lxActualReadLen,&lxState);/*从队列中取出一组CAN数据*/
        if(lxActualReadLen == sizeof(can_rx_message_type) && lxState == kMultiCycFiFo_Error_NONE)
        {
            gulCommunicationCnt = 0;        /*复位通信超时计数*/
            vCAN_Receive_Message(&lxCanRxMsg,&gxBikeInfo);
        }
    }

    /*判断发送缓冲区是否有数据需要发送*/
    MCF_GetCanReadLen(gxCAN_TxQueue,&lxFifoCanReadLen,&lxState);
    if(lxState == kMultiCycFiFo_Error_NONE && lxFifoCanReadLen > 0)
    {
        MCF_ReadDataFromFifo(gxCAN_TxQueue,sizeof(can_tx_message_type),(uint8_t *)&lxCanTxMsg,&lxActualReadLen,&lxState);/*从队列中取出一组CAN数据*/
        if(lxActualReadLen == sizeof(can_tx_message_type) && lxState == kMultiCycFiFo_Error_NONE)
        {
            can_message_transmit(CAN1,&lxCanTxMsg);     /*调用系统库函数进行发送*/
        }
    }
}

/******************************************************************************
** 功  能：接收处理源节点为控制器的消息
** 参  数：pBFCanMsg-接收到的Can消息指针，pBikeInfo-车辆信息结构体指针
** 返回值：无
** 备  注：
******************************************************************************/
static void vCAN_Receive_Message(can_rx_message_type *pCanRxMsg,strBikeInfo *pBikeInfo)
{

    switch(pCanRxMsg->extended_id)
    {
    case 0x100:          /*控制器错误代码*/
    {
        gucMCUErrorCnt = 0;
        pBikeInfo->MCU.ErrorCode = ((uint32_t)pCanRxMsg->data[3] << 24) | ((uint32_t)pCanRxMsg->data[2] << 16) | ((uint32_t)pCanRxMsg->data[1] << 8) | ((uint32_t)pCanRxMsg->data[0]);
        break;
    }
    case 0x182:          /*控制器电压、电流数据*/
    {
        pBikeInfo->MCU.Voltage = ((uint16_t)pCanRxMsg->data[1] << 8) | pCanRxMsg->data[0];
        pBikeInfo->MCU.Current = ((uint16_t)pCanRxMsg->data[3] << 8) | pCanRxMsg->data[2];
        break;
    }
    case 0x183:          /*剩余里程和剩余时间*/
    {
        pBikeInfo->MCU.Range          = ((uint16_t)pCanRxMsg->data[1] << 8) | pCanRxMsg->data[0];
        pBikeInfo->MCU.Remaining_Time = ((uint16_t)pCanRxMsg->data[3] << 8) | pCanRxMsg->data[2];
        break;
    }
    case 0x184:          /*电机功率信息*/
    {
        pBikeInfo->MCU.Power = ((uint16_t)pCanRxMsg->data[7] << 8) | pCanRxMsg->data[6];
        break;
    }
    case 0x18A:          /*速度、Trip、ODO信息*/
    {
        pBikeInfo->MCU.Speed = ((uint16_t)pCanRxMsg->data[1] << 8) | pCanRxMsg->data[0];
        pBikeInfo->MCU.Trip  = ((uint16_t)pCanRxMsg->data[3] << 8) | pCanRxMsg->data[2];
        pBikeInfo->MCU.Odo   = ((uint16_t)pCanRxMsg->data[5] << 8) | pCanRxMsg->data[4];
        break;
    }
    case 0x283:          /*BMS系统的电压、电流、电量*/
    {
        pBikeInfo->Battery.Voltage = ((uint16_t)pCanRxMsg->data[1] << 8) | pCanRxMsg->data[0];
        pBikeInfo->Battery.Current = ((int16_t) pCanRxMsg->data[3] << 8) | pCanRxMsg->data[0];
        pBikeInfo->Battery.Soc     = pCanRxMsg->data[6];
        break;
    }
    case 0x284:          /*BMS系统的错误代码*/
    {
        gucBMSErrorCnt = 0;
        pBikeInfo->Battery.ErrCode = ((uint16_t)pCanRxMsg->data[1] << 8) | pCanRxMsg->data[0];
        break;
    }

    default:
    {
        break;
    }
    }
}



/******************************************************************************
** 功  能：仪表发送消息
** 参  数：ID-要发送的帧ID，pBikeInfo-车辆信息结构体指针
** 返回值：无
** 备  注：
******************************************************************************/
static void vCan_Send_DisplayMessage(uint32_t ID,strBikeInfo   *pBikeInfo)
{
    can_tx_message_type         lxCanTxMsg;
    muilt_cyc_fifo_error_code_t lxState;


    lxCanTxMsg.id_type     = CAN_ID_EXTENDED;
    lxCanTxMsg.frame_type  = CAN_TFT_DATA;
    lxCanTxMsg.extended_id = ID;
    lxCanTxMsg.dlc         = 8;

    switch(ID)
    {
    case 0x300:/*仪表开机后持续发送的帧*/
    {

        lxCanTxMsg.data[0] = 0;         /*Normal Mode*/
        lxCanTxMsg.data[1] = 0;         /*No Error*/
        lxCanTxMsg.data[2] = 0;
        lxCanTxMsg.data[3] = 0;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0;
        break;
    }
    case 0x102:/*关机帧*/
    {
        lxCanTxMsg.data[0] = 0x66;
        lxCanTxMsg.data[1] = 0xBB;
        lxCanTxMsg.data[2] = 0x66;
        lxCanTxMsg.data[3] = 0xBB;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0;
        break;
    }
    case 0x13D:/*仪表清Trip命令*/
    {

        lxCanTxMsg.data[0] = 0;
        lxCanTxMsg.data[1] = 0;
        lxCanTxMsg.data[2] = 0;
        lxCanTxMsg.data[3] = 0;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0x55;
        break;
    }
    case 0x13E:/*仪表发送的挡位*/
    {

        lxCanTxMsg.data[0] = pBikeInfo->Display.Pas;
        lxCanTxMsg.data[1] = 0;
        lxCanTxMsg.data[2] = 0;
        lxCanTxMsg.data[3] = 0;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0x55;
        break;
    }
    case 0x13F:/*仪表发送的单位类型*/
    {

        lxCanTxMsg.data[0] = pBikeInfo->Display.Unit;
        lxCanTxMsg.data[1] = 0;
        lxCanTxMsg.data[2] = 0;
        lxCanTxMsg.data[3] = 0;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0x55;
        break;
    }
    case 0x1C2:/*仪表发送的灯控信号*/
    {

        lxCanTxMsg.data[0] = pBikeInfo->Display.Lamp;
        lxCanTxMsg.data[1] = 0;
        lxCanTxMsg.data[2] = 0;
        lxCanTxMsg.data[3] = 0;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0x44;
        break;
    }
    case 0x1CC:/*仪表发送的助推命令*/
    {

        lxCanTxMsg.data[0] = pBikeInfo->Display.Walk;
        lxCanTxMsg.data[1] = 0;
        lxCanTxMsg.data[2] = 0;
        lxCanTxMsg.data[3] = 0;
        lxCanTxMsg.data[4] = 0;
        lxCanTxMsg.data[5] = 0;
        lxCanTxMsg.data[6] = 0;
        lxCanTxMsg.data[7] = 0x55;
        break;
    }

    }


    MCF_WriteDataInFifo(gxCAN_TxQueue,(uint8_t *)&lxCanTxMsg,sizeof(can_tx_message_type),&lxState); /*将数据放入发送队列，排队发送*/
}



/******************************************************************************
** 功  能：设置大灯状态
** 参  数：State-大灯状态。0-关闭，1-打开
** 返回值：无
** 备  注：所有协议通用
******************************************************************************/
void vPROTOCOL_Set_Lamp(uint8_t State)
{
    gxBikeInfo.Display.Lamp = State;/*灯状态*/

}

/******************************************************************************
** 功  能：设置单位类型
** 参  数：Unit-单位，0-公制，1-英制
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_Unit(uint8_t Unit)
{
    gxBikeInfo.Display.Unit = Unit;

}


/******************************************************************************
** 功  能：设置档位
** 参  数：Pas-档位值，最大为9，最小为-1,-1表示助推档
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_Pas(int8_t Pas)
{
    /*-1表示助推档*/
    if(Pas < 0)
    {
        gxBikeInfo.Display.Walk = 1;
    }
    else
    {
        gxBikeInfo.Display.Walk = 0;
        gxBikeInfo.Display.Pas  = Pas;
    }

}

/******************************************************************************
** 功  能：清Trip指令
** 参  数：Cmd-清Trip指令，0-不清，1-清
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_ClearTrip(uint8_t Cmd)
{
    if(Cmd)
    {
        vCan_Send_DisplayMessage(0x13D,&gxBikeInfo);
    }
}

/******************************************************************************
** 功  能：关机指令
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_PowerOff(void)
{
    gxBikeInfo.Display.Pas      = 0;
    gxBikeInfo.Display.Lamp     = 0;
    gxBikeInfo.Display.PowerOff = 1;
}

/******************************************************************************
** 功  能：获取当前电流值
** 参  数：无
** 返回值：实际电流值的10倍。比如实际电流12.3A，返回123
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_Current(void)
{
    return gxBikeInfo.MCU.Current / 10;  /*控制器发送的电流值单位是0.01A*/
}

/******************************************************************************
** 功  能：获取电机功率值
** 参  数：无
** 返回值：功率，w
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_Power(void)
{
    return gxBikeInfo.MCU.Power;  /*单位W*/
}


/******************************************************************************
** 功  能：获取当前车速
** 参  数：无
** 返回值：实际车速*10.比如返回120，实际车速即12.0Km/h
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_Speed(void)
{
    return gxBikeInfo.MCU.Speed;
}

/******************************************************************************
** 功  能：获取Trip里程
** 参  数：无
** 返回值：Trip里程，0.1km
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_Trip(void)
{
    return gxBikeInfo.MCU.Trip;
}

/******************************************************************************
** 功  能：获取ODO里程
** 参  数：无
** 返回值：ODO里程，1km
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_Odo(void)
{
    return gxBikeInfo.MCU.Odo;
}

/******************************************************************************
** 功  能：获取剩余里程
** 参  数：无
** 返回值：剩余里程，km
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_Range(void)
{
    return gxBikeInfo.MCU.Range;
}

/******************************************************************************
** 功  能：获取电压
** 参  数：无
** 返回值：电压值，0.1V
** 备  注：该函数是协议模块对我的电压获取接口。返回逻辑是
**        当BMS读取电压>0时，优先返回BMS电压。否则返回控制器上传的电压
******************************************************************************/
uint16_t usPROTOCOL_Get_Voltage(void)
{
    if(gxBikeInfo.Battery.Voltage > 0)
    {
        return gxBikeInfo.Battery.Voltage / 100;
    }
    else
    {
        return gxBikeInfo.MCU.Voltage / 10;
    }
}

/******************************************************************************
** 功  能：获取错误代码
** 参  数：无
** 返回值：十六进制的错误代码
** 备  注：包括30错误代码（通信超时）
**        报错代码包含两种，MCU的报错用100一下的数字表示，BMS的报错用100以上数字表示（这个和协议无关，是为了显示方便自己定义的）
**        EagoTech协议，报错代码是显示当前的报错位，比如MCU的错误代码，Bit3置位，就显示 C 03，BMS的错误代码 Bit2置位，就显示B 02
******************************************************************************/
uint8_t ucPROTOCOL_Get_Errcode(void)
{
    uint8_t n = 0;
    if(gxBikeInfo.ErrCode > 0)
    {
        return gxBikeInfo.ErrCode;
    }
    else
    {
        if(gxBikeInfo.MCU.ErrorCode > 0)
        {
            for(n = 0; n < 32; n++)
            {
                if(gxBikeInfo.MCU.ErrorCode & (0x01UL << n))
                {
                    break;
                }
            }
            return n;
        }
        else if(gxBikeInfo.Battery.ErrCode > 0)
        {
            for(n = 0; n < 16; n++)
            {
                if(gxBikeInfo.Battery.ErrCode & (0x01UL << n))
                {
                    break;
                }
            }
            return n + 1 + 100;     /*对于BMS的报错，用100以后的数字表示*/
        }
        else
        {
            return 0;
        }
    }

}

/******************************************************************************
** 功  能：获取电池容量
** 参  数：无
** 返回值：-1表示未获取到电池容量，电池容量，0-100%
** 备  注：协议不支持SOC，返回-1，为了兼容其他协议。
******************************************************************************/
int8_t cPROTOCOL_Get_Soc(void)
{
    /*如果从BMS读取到电池SOC，则返回对应值，否则返回-1，表示无效*/
    if(gxBikeInfo.Battery.Soc > -1)
    {
        return gxBikeInfo.Battery.Soc / 2;  /*从协议读取到的SOC，范围是0-200，分辨率0.5，需要除以2*/
    }
    else
    {
        return -1;
    }
}

/******************************************************************************
** 功  能：获取BMS电压
** 参  数：无
** 返回值：BMS电压值，0.1V
** 备  注：
******************************************************************************/
uint16_t usPROTOCOL_Get_BMS_Voltage(void)
{
    return gxBikeInfo.Battery.Voltage / 100;
}

/******************************************************************************
** 功  能：获取BMS电流
** 参  数：无
** 返回值：BMS电流值，0.1V
** 备  注：
******************************************************************************/
int16_t sPROTOCOL_Get_BMS_Current(void)
{
    return gxBikeInfo.Battery.Current / 10;
}




/******************************************************************************
** 功  能：工厂指令的解析
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Factory_Command(can_rx_message_type *pCanRxMsg)
{
    uint16_t lusResponse;

    switch(pCanRxMsg->extended_id)
    {
    case 0x1F18016E:/*校准光感，返回0x03F8016E*/
    {
        lusResponse = vPhotoDiode_Calibration();
        vPROTOCOL_Factory_Response(pCanRxMsg->extended_id,lusResponse);
        break;
    }
    case 0x1F18025D:/*校准电压，返回0x03F8025D*/
    {
        lusResponse = vVoltage_Calibration();
        vPROTOCOL_Factory_Response(pCanRxMsg->extended_id,lusResponse);
        break;
    }
    case 0x1F180371:/*校准时间，返回0x03F80371*/
    {
        vDateTime_Calibration(pCanRxMsg->data[3],pCanRxMsg->data[4],pCanRxMsg->data[5],pCanRxMsg->data[0],pCanRxMsg->data[1],pCanRxMsg->data[2]);
        lusResponse = 1234;
        vPROTOCOL_Factory_Response(pCanRxMsg->extended_id,lusResponse);
        break;
    }
    case 0x1F18048E:/*清ODO，返回0x03F8048E*/
    {
        vClear_ODO();
        lusResponse = 5678;
        vPROTOCOL_Factory_Response(pCanRxMsg->extended_id,lusResponse);
        break;
    }
    }
}

/******************************************************************************
** 功  能：工厂指令的返回
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
static void vPROTOCOL_Factory_Response(uint32_t Cmd,uint16_t Data)
{
    can_tx_message_type    lxCanTxMessage;

    lxCanTxMessage.id_type      = CAN_ID_EXTENDED;      /*扩展帧*/
    lxCanTxMessage.frame_type   = CAN_TFT_DATA;         /*数据帧*/
    lxCanTxMessage.dlc          = 2;                    /*数据长度*/
    lxCanTxMessage.extended_id  = 0x03F80000 | (Cmd & 0x0000FFFF);
    lxCanTxMessage.data[0]      = Data >> 8;
    lxCanTxMessage.data[1]      = (uint8_t)Data;

    /*调用发送函数进行发送*/
    can_message_transmit(CAN1,&lxCanTxMessage);
}

/******************************************************************************
** 功  能：复位通信超时计数变量
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_ResetCommunicationOverTime(void)
{
    gulCommunicationCnt = 0;        /*复位通信超时计数*/
    if(gxBikeInfo.ErrCode == 0x30)
    {
        gxBikeInfo.ErrCode = 0;
    }
}


/******************************************************************************
** 功  能：开机上电时，设置默认要发送给控制器的数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_Value_When_PowerOn(void)
{
    vPROTOCOL_Set_Pas(0);                                           /*开机LOGO界面发0档*/
    vPROTOCOL_Set_Unit(gtParam.Unit);
}

/******************************************************************************
** 功  能：退出设置时，设置默认要发送给控制器的数据
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPROTOCOL_Set_Value_When_ExitSetting(void)
{
    vPROTOCOL_Set_Unit(gtParam.Unit);

}


